﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MoroMoro.Samples.ToDoList.Base.Persistence;
using MoroMoro.Samples.ToDoList.Domain.Categories;

namespace MoroMoro.Samples.ToDoList.Application.Categories
{
    /// <summary>
    /// <see cref="Category">カテゴリ</see>の制約検証を行います。
    /// </summary>
    [Serializable]
    internal sealed class CategoryConstraintValidator : Category.IConstraintValidator
    {
        /// <summary>
        /// <see cref="CategoryConstraintValidator"/> クラスの新しいインスタンスを初期化します。
        /// </summary>
        /// <param name="repository"><see cref="Category"/> のリポジトリ。</param>
        /// <exception cref="System.ArgumentNullException">repository が null です。</exception>
        public CategoryConstraintValidator(IRepository<Category> repository)
        {
            if (repository == null)
            {
                throw new ArgumentNullException("repository");
            }
            _repository = repository;
        }

        /// <summary>
        /// <see cref="Category">カテゴリ</see>のリポジトリ。
        /// </summary>
        private readonly IRepository<Category> _repository;

        /// <inheritdoc/>
        public bool NameIsUnique(string name)
        {
            var spec = new CategoryNameSpecification(name);
            return !_repository.Exists(spec);
        }
    }
}
